On 12/17/2019 6:44 AM, Sebastian, Selwin wrote:
> [AMD Official Use Only - Internal Distribution Only]
> 
> Hi Ferruh,
>       Current driver was developed for EPYC 3000 processors. New processors 
> V1000/R1000 is also using the same PCI id for axgbe but register definitions 
> for determining the window settings for indirect PCS access is changed. In 
> order to identify processor, we are adding a quirk.
> 15d0 is the pci id for V1000/R1000/Raven root complex( 
> https://pci-ids.ucw.cz/read/PC/1022 ). Hence read pci-id of root complex  to 
> determine which processor and set the registers accordingly. 
> 

Got it, it is better to add a define for 0x15d0 with an explanation, and for the
root complex device use a more descriptive variable name that 'pdev'.

But still it is not really good idea to access the pci device list, isn't there
any other way to differentiate the devices, sub-device id etc? And how does
linux driver manages this?

And is it guaranteed that root complex device always will be the first device?


> Thanks and Regards
> Selwin Sebastian
>  
> 
> -----Original Message-----
> From: Ferruh Yigit <ferruh.yi...@intel.com> 
> Sent: Wednesday, December 11, 2019 5:12 PM
> To: Sebastian, Selwin <selwin.sebast...@amd.com>; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: Add a HW quirk for register 
> definitions
> 
> [CAUTION: External Email]
> 
> On 12/10/2019 3:29 PM, Selwin Sebastian wrote:
>> V1000/R1000 processors are using the same PCI ids for the network 
>> device but has altered register definitions for determining the window 
>> settings for the indirect PCS access.Add support to check for this 
>> hardware and if found use the new register values
> 
> How they are differentiated, subdevice ids?
> If so should we add subdevice fields check into DPDK?
> 
>>
>> Signed-off-by: Selwin Sebastian <selwin.sebast...@amd.com>
>> ---
>>  drivers/net/axgbe/axgbe_common.h |  2 ++  
>> drivers/net/axgbe/axgbe_ethdev.c | 18 +++++++++++++++---
>>  2 files changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/net/axgbe/axgbe_common.h 
>> b/drivers/net/axgbe/axgbe_common.h
>> index 34f60f156..4a3fbac16 100644
>> --- a/drivers/net/axgbe/axgbe_common.h
>> +++ b/drivers/net/axgbe/axgbe_common.h
>> @@ -841,6 +841,8 @@
>>  #define PCS_V1_WINDOW_SELECT         0x03fc
>>  #define PCS_V2_WINDOW_DEF            0x9060
>>  #define PCS_V2_WINDOW_SELECT         0x9064
>> +#define PCS_V2_RV_WINDOW_DEF         0x1060
>> +#define PCS_V2_RV_WINDOW_SELECT              0x1064
>>
>>  /* PCS register entry bit positions and sizes */
>>  #define PCS_V2_WINDOW_DEF_OFFSET_INDEX       6
>> diff --git a/drivers/net/axgbe/axgbe_ethdev.c 
>> b/drivers/net/axgbe/axgbe_ethdev.c
>> index d1f160e79..25e182b8d 100644
>> --- a/drivers/net/axgbe/axgbe_ethdev.c
>> +++ b/drivers/net/axgbe/axgbe_ethdev.c
>> @@ -31,6 +31,7 @@ static int  axgbe_dev_info_get(struct rte_eth_dev *dev,
>>  #define AMD_PCI_VENDOR_ID       0x1022
>>  #define AMD_PCI_AXGBE_DEVICE_V2A 0x1458  #define 
>> AMD_PCI_AXGBE_DEVICE_V2B 0x1459
>> +extern struct rte_pci_bus rte_pci_bus;
> 
> Not sure about accessing the bus device list from a PMD...
> 
>>
>>  int axgbe_logtype_init;
>>  int axgbe_logtype_driver;
>> @@ -585,6 +586,7 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)
>>       struct rte_pci_device *pci_dev;
>>       uint32_t reg, mac_lo, mac_hi;
>>       int ret;
>> +     struct rte_pci_device *pdev;
>>
>>       eth_dev->dev_ops = &axgbe_eth_dev_ops;
>>       eth_dev->rx_pkt_burst = &axgbe_recv_pkts; @@ -605,6 +607,17 @@ 
>> eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)
>>       pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
>>       pdata->pci_dev = pci_dev;
>>
>> +     pdev = TAILQ_FIRST(&rte_pci_bus.device_list);
> 
> Can you please describe what this does? You are reading first pci device and 
> do you assume it is an axgbe device? And do you also assume there is single 
> axgbe device?
> 
> Why you are not simply using 'pci_dev' above?
> 
>> +
>> +     if (pdev->id.vendor_id == AMD_PCI_VENDOR_ID &&
>> +             pdev->id.device_id == 0x15d0) {
> 
> As far as I can see, '0x15d0' is not in the supported pci_id list, so why you 
> are checking it here? That devices shouldn't be probed at all ...
> 
>> +                     pdata->xpcs_window_def_reg = PCS_V2_RV_WINDOW_DEF;
>> +                     pdata->xpcs_window_sel_reg = PCS_V2_RV_WINDOW_SELECT;
>> +     } else {
>> +             pdata->xpcs_window_def_reg = PCS_V2_WINDOW_DEF;
>> +             pdata->xpcs_window_sel_reg = PCS_V2_WINDOW_SELECT;
>> +     }
>> +
>>       pdata->xgmac_regs =
>>               (void *)pci_dev->mem_resource[AXGBE_AXGMAC_BAR].addr;
>>       pdata->xprop_regs = (void *)((uint8_t *)pdata->xgmac_regs @@ 
>> -620,14 +633,13 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)
>>               pdata->vdata = &axgbe_v2b;
>>
>>       /* Configure the PCS indirect addressing support */
>> -     reg = XPCS32_IOREAD(pdata, PCS_V2_WINDOW_DEF);
>> +     reg = XPCS32_IOREAD(pdata, pdata->xpcs_window_def_reg);
>>       pdata->xpcs_window = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, OFFSET);
>>       pdata->xpcs_window <<= 6;
>>       pdata->xpcs_window_size = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, SIZE);
>>       pdata->xpcs_window_size = 1 << (pdata->xpcs_window_size + 7);
>>       pdata->xpcs_window_mask = pdata->xpcs_window_size - 1;
>> -     pdata->xpcs_window_def_reg = PCS_V2_WINDOW_DEF;
>> -     pdata->xpcs_window_sel_reg = PCS_V2_WINDOW_SELECT;
>> +
>>       PMD_INIT_LOG(DEBUG,
>>                    "xpcs window :%x, size :%x, mask :%x ", 
>> pdata->xpcs_window,
>>                    pdata->xpcs_window_size, pdata->xpcs_window_mask);
>>

Reply via email to