habanalabs: modify dma_mask to be ASIC specific property
The required DMA mask is no longer based on input from the F/W, but it is fixed per ASIC according to its address space. As such, the per-ASIC function to get this value can be replaced with a property variable. Signed-off-by: Tomer Tayar <ttayar@habana.ai> Reviewed-by: Oded Gabbay <ogabbay@kernel.org> Signed-off-by: Oded Gabbay <ogabbay@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c41cb902b2
commit
687c6b535e
|
@ -552,6 +552,7 @@ struct hl_hints_range {
|
||||||
* @configurable_stop_on_err: is stop-on-error option configurable via debugfs.
|
* @configurable_stop_on_err: is stop-on-error option configurable via debugfs.
|
||||||
* @set_max_power_on_device_init: true if need to set max power in F/W on device init.
|
* @set_max_power_on_device_init: true if need to set max power in F/W on device init.
|
||||||
* @supports_user_set_page_size: true if user can set the allocation page size.
|
* @supports_user_set_page_size: true if user can set the allocation page size.
|
||||||
|
* @dma_mask: the dma mask to be set for this device
|
||||||
*/
|
*/
|
||||||
struct asic_fixed_properties {
|
struct asic_fixed_properties {
|
||||||
struct hw_queue_properties *hw_queues_props;
|
struct hw_queue_properties *hw_queues_props;
|
||||||
|
@ -639,6 +640,7 @@ struct asic_fixed_properties {
|
||||||
u8 configurable_stop_on_err;
|
u8 configurable_stop_on_err;
|
||||||
u8 set_max_power_on_device_init;
|
u8 set_max_power_on_device_init;
|
||||||
u8 supports_user_set_page_size;
|
u8 supports_user_set_page_size;
|
||||||
|
u8 dma_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1274,8 +1276,6 @@ struct fw_load_mgr {
|
||||||
* @gen_wait_cb: Generate a wait CB.
|
* @gen_wait_cb: Generate a wait CB.
|
||||||
* @reset_sob: Reset a SOB.
|
* @reset_sob: Reset a SOB.
|
||||||
* @reset_sob_group: Reset SOB group
|
* @reset_sob_group: Reset SOB group
|
||||||
* @set_dma_mask_from_fw: set the DMA mask in the driver according to the
|
|
||||||
* firmware configuration
|
|
||||||
* @get_device_time: Get the device time.
|
* @get_device_time: Get the device time.
|
||||||
* @collective_wait_init_cs: Generate collective master/slave packets
|
* @collective_wait_init_cs: Generate collective master/slave packets
|
||||||
* and place them in the relevant cs jobs
|
* and place them in the relevant cs jobs
|
||||||
|
@ -1407,7 +1407,6 @@ struct hl_asic_funcs {
|
||||||
struct hl_gen_wait_properties *prop);
|
struct hl_gen_wait_properties *prop);
|
||||||
void (*reset_sob)(struct hl_device *hdev, void *data);
|
void (*reset_sob)(struct hl_device *hdev, void *data);
|
||||||
void (*reset_sob_group)(struct hl_device *hdev, u16 sob_group);
|
void (*reset_sob_group)(struct hl_device *hdev, u16 sob_group);
|
||||||
void (*set_dma_mask_from_fw)(struct hl_device *hdev);
|
|
||||||
u64 (*get_device_time)(struct hl_device *hdev);
|
u64 (*get_device_time)(struct hl_device *hdev);
|
||||||
int (*collective_wait_init_cs)(struct hl_cs *cs);
|
int (*collective_wait_init_cs)(struct hl_cs *cs);
|
||||||
int (*collective_wait_create_jobs)(struct hl_device *hdev,
|
int (*collective_wait_create_jobs)(struct hl_device *hdev,
|
||||||
|
@ -2688,7 +2687,6 @@ struct hl_reset_info {
|
||||||
* huge pages.
|
* huge pages.
|
||||||
* @init_done: is the initialization of the device done.
|
* @init_done: is the initialization of the device done.
|
||||||
* @device_cpu_disabled: is the device CPU disabled (due to timeouts)
|
* @device_cpu_disabled: is the device CPU disabled (due to timeouts)
|
||||||
* @dma_mask: the dma mask that was set for this device
|
|
||||||
* @in_debug: whether the device is in a state where the profiling/tracing infrastructure
|
* @in_debug: whether the device is in a state where the profiling/tracing infrastructure
|
||||||
* can be used. This indication is needed because in some ASICs we need to do
|
* can be used. This indication is needed because in some ASICs we need to do
|
||||||
* specific operations to enable that infrastructure.
|
* specific operations to enable that infrastructure.
|
||||||
|
@ -2813,7 +2811,6 @@ struct hl_device {
|
||||||
u8 pmmu_huge_range;
|
u8 pmmu_huge_range;
|
||||||
u8 init_done;
|
u8 init_done;
|
||||||
u8 device_cpu_disabled;
|
u8 device_cpu_disabled;
|
||||||
u8 dma_mask;
|
|
||||||
u8 in_debug;
|
u8 in_debug;
|
||||||
u8 cdev_sysfs_created;
|
u8 cdev_sysfs_created;
|
||||||
u8 stop_on_err;
|
u8 stop_on_err;
|
||||||
|
|
|
@ -309,9 +309,6 @@ static int fixup_device_params(struct hl_device *hdev)
|
||||||
/* Enable only after the initialization of the device */
|
/* Enable only after the initialization of the device */
|
||||||
hdev->disabled = true;
|
hdev->disabled = true;
|
||||||
|
|
||||||
/* Set default DMA mask to 32 bits */
|
|
||||||
hdev->dma_mask = 32;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -392,6 +392,7 @@ enum pci_region hl_get_pci_memory_region(struct hl_device *hdev, u64 addr)
|
||||||
*/
|
*/
|
||||||
int hl_pci_init(struct hl_device *hdev)
|
int hl_pci_init(struct hl_device *hdev)
|
||||||
{
|
{
|
||||||
|
struct asic_fixed_properties *prop = &hdev->asic_prop;
|
||||||
struct pci_dev *pdev = hdev->pdev;
|
struct pci_dev *pdev = hdev->pdev;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
@ -419,17 +420,14 @@ int hl_pci_init(struct hl_device *hdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Driver must sleep in order for FW to finish the iATU configuration */
|
/* Driver must sleep in order for FW to finish the iATU configuration */
|
||||||
if (hdev->asic_prop.iatu_done_by_fw) {
|
if (hdev->asic_prop.iatu_done_by_fw)
|
||||||
usleep_range(2000, 3000);
|
usleep_range(2000, 3000);
|
||||||
hdev->asic_funcs->set_dma_mask_from_fw(hdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = dma_set_mask_and_coherent(&pdev->dev,
|
rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(prop->dma_mask));
|
||||||
DMA_BIT_MASK(hdev->dma_mask));
|
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_err(hdev->dev,
|
dev_err(hdev->dev,
|
||||||
"Failed to set dma mask to %d bits, error %d\n",
|
"Failed to set dma mask to %d bits, error %d\n",
|
||||||
hdev->dma_mask, rc);
|
prop->dma_mask, rc);
|
||||||
goto unmap_pci_bars;
|
goto unmap_pci_bars;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -674,6 +674,8 @@ static int gaudi_set_fixed_properties(struct hl_device *hdev)
|
||||||
|
|
||||||
prop->set_max_power_on_device_init = true;
|
prop->set_max_power_on_device_init = true;
|
||||||
|
|
||||||
|
prop->dma_mask = 48;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -755,8 +757,6 @@ static int gaudi_init_iatu(struct hl_device *hdev)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
hdev->asic_funcs->set_dma_mask_from_fw(hdev);
|
|
||||||
|
|
||||||
/* Outbound Region 0 - Point to Host */
|
/* Outbound Region 0 - Point to Host */
|
||||||
outbound_region.addr = HOST_PHYS_BASE;
|
outbound_region.addr = HOST_PHYS_BASE;
|
||||||
outbound_region.size = HOST_PHYS_SIZE;
|
outbound_region.size = HOST_PHYS_SIZE;
|
||||||
|
@ -9065,11 +9065,6 @@ static void gaudi_reset_sob(struct hl_device *hdev, void *data)
|
||||||
kref_init(&hw_sob->kref);
|
kref_init(&hw_sob->kref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gaudi_set_dma_mask_from_fw(struct hl_device *hdev)
|
|
||||||
{
|
|
||||||
hdev->dma_mask = 48;
|
|
||||||
}
|
|
||||||
|
|
||||||
static u64 gaudi_get_device_time(struct hl_device *hdev)
|
static u64 gaudi_get_device_time(struct hl_device *hdev)
|
||||||
{
|
{
|
||||||
u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
|
u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
|
||||||
|
@ -9474,7 +9469,6 @@ static const struct hl_asic_funcs gaudi_funcs = {
|
||||||
.gen_wait_cb = gaudi_gen_wait_cb,
|
.gen_wait_cb = gaudi_gen_wait_cb,
|
||||||
.reset_sob = gaudi_reset_sob,
|
.reset_sob = gaudi_reset_sob,
|
||||||
.reset_sob_group = gaudi_reset_sob_group,
|
.reset_sob_group = gaudi_reset_sob_group,
|
||||||
.set_dma_mask_from_fw = gaudi_set_dma_mask_from_fw,
|
|
||||||
.get_device_time = gaudi_get_device_time,
|
.get_device_time = gaudi_get_device_time,
|
||||||
.collective_wait_init_cs = gaudi_collective_wait_init_cs,
|
.collective_wait_init_cs = gaudi_collective_wait_init_cs,
|
||||||
.collective_wait_create_jobs = gaudi_collective_wait_create_jobs,
|
.collective_wait_create_jobs = gaudi_collective_wait_create_jobs,
|
||||||
|
|
|
@ -488,6 +488,8 @@ int goya_set_fixed_properties(struct hl_device *hdev)
|
||||||
|
|
||||||
prop->set_max_power_on_device_init = true;
|
prop->set_max_power_on_device_init = true;
|
||||||
|
|
||||||
|
prop->dma_mask = 48;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -575,8 +577,6 @@ static int goya_init_iatu(struct hl_device *hdev)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
hdev->asic_funcs->set_dma_mask_from_fw(hdev);
|
|
||||||
|
|
||||||
/* Outbound Region 0 - Point to Host */
|
/* Outbound Region 0 - Point to Host */
|
||||||
outbound_region.addr = HOST_PHYS_BASE;
|
outbound_region.addr = HOST_PHYS_BASE;
|
||||||
outbound_region.size = HOST_PHYS_SIZE;
|
outbound_region.size = HOST_PHYS_SIZE;
|
||||||
|
@ -5562,11 +5562,6 @@ static void goya_reset_sob_group(struct hl_device *hdev, u16 sob_group)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void goya_set_dma_mask_from_fw(struct hl_device *hdev)
|
|
||||||
{
|
|
||||||
hdev->dma_mask = 48;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 goya_get_device_time(struct hl_device *hdev)
|
u64 goya_get_device_time(struct hl_device *hdev)
|
||||||
{
|
{
|
||||||
u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
|
u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
|
||||||
|
@ -5754,7 +5749,6 @@ static const struct hl_asic_funcs goya_funcs = {
|
||||||
.gen_wait_cb = goya_gen_wait_cb,
|
.gen_wait_cb = goya_gen_wait_cb,
|
||||||
.reset_sob = goya_reset_sob,
|
.reset_sob = goya_reset_sob,
|
||||||
.reset_sob_group = goya_reset_sob_group,
|
.reset_sob_group = goya_reset_sob_group,
|
||||||
.set_dma_mask_from_fw = goya_set_dma_mask_from_fw,
|
|
||||||
.get_device_time = goya_get_device_time,
|
.get_device_time = goya_get_device_time,
|
||||||
.collective_wait_init_cs = goya_collective_wait_init_cs,
|
.collective_wait_init_cs = goya_collective_wait_init_cs,
|
||||||
.collective_wait_create_jobs = goya_collective_wait_create_jobs,
|
.collective_wait_create_jobs = goya_collective_wait_create_jobs,
|
||||||
|
|
Loading…
Reference in New Issue