Move pcie register access lock to register access block.
Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
struct amdgpu_mmio_remap rmmio_remap;
/* Indirect register access blocks */
struct amdgpu_reg_access reg;
- /* protects concurrent PCIE register access */
- spinlock_t pcie_idx_lock;
struct amdgpu_doorbell doorbell;
/* clock/pll info */
return r;
spin_lock_init(&adev->mmio_idx_lock);
- spin_lock_init(&adev->pcie_idx_lock);
spin_lock_init(&adev->mm_stats.lock);
spin_lock_init(&adev->virt.rlcg_reg_lock);
spin_lock_init(&adev->wb.lock);
adev->reg.audio_endpt.rreg = NULL;
adev->reg.audio_endpt.wreg = NULL;
+ spin_lock_init(&adev->reg.pcie.lock);
adev->reg.pcie.rreg = NULL;
adev->reg.pcie.wreg = NULL;
adev->reg.pcie.rreg_ext = NULL;
pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
writel(reg_addr, pcie_index_offset);
readl(pcie_index_offset);
r = readl(pcie_data_offset);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
pcie_index_hi = 0;
}
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
if (pcie_index_hi != 0)
readl(pcie_index_hi_offset);
}
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
writel(reg_addr + 4, pcie_index_offset);
readl(pcie_index_offset);
r |= ((u64)readl(pcie_data_offset) << 32);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
pcie_index_hi =
adev->nbio.funcs->get_pcie_index_hi_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
if (pcie_index_hi != 0)
readl(pcie_index_hi_offset);
}
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
readl(pcie_index_offset);
writel(reg_data, pcie_data_offset);
readl(pcie_data_offset);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
void amdgpu_device_indirect_wreg_ext(struct amdgpu_device *adev, u64 reg_addr,
else
pcie_index_hi = 0;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
if (pcie_index_hi != 0)
readl(pcie_index_hi_offset);
}
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
/**
pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
readl(pcie_index_offset);
writel((u32)(reg_data >> 32), pcie_data_offset);
readl(pcie_data_offset);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
void amdgpu_device_indirect_wreg64_ext(struct amdgpu_device *adev, u64 reg_addr,
pcie_index_hi =
adev->nbio.funcs->get_pcie_index_hi_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
if (pcie_index_hi != 0)
readl(pcie_index_hi_offset);
}
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
u32 amdgpu_device_pcie_port_rreg(struct amdgpu_device *adev, u32 reg)
address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(address, reg * 4);
(void)RREG32(address);
r = RREG32(data);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(address, reg * 4);
(void)RREG32(address);
WREG32(data, v);
(void)RREG32(data);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
uint32_t amdgpu_device_wait_on_rreg(struct amdgpu_device *adev, uint32_t inst,
};
struct amdgpu_reg_pcie_ind {
+ spinlock_t lock;
amdgpu_rreg_t rreg;
amdgpu_wreg_t wreg;
amdgpu_rreg_ext_t rreg_ext;
unsigned long flags;
u32 r;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(mmPCIE_INDEX, reg);
(void)RREG32(mmPCIE_INDEX);
r = RREG32(mmPCIE_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
{
unsigned long flags;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(mmPCIE_INDEX, reg);
(void)RREG32(mmPCIE_INDEX);
WREG32(mmPCIE_DATA, v);
(void)RREG32(mmPCIE_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
address = adev->nbio.funcs->get_pcie_index_offset(adev);
data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(address, smnDF_PIE_AON_FabricIndirectConfigAccessAddress3);
WREG32(data, ficaa_val);
WREG32(address, smnDF_PIE_AON_FabricIndirectConfigAccessDataHi3);
ficadh_val = RREG32(data);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return (((ficadh_val & 0xFFFFFFFFFFFFFFFF) << 32) | ficadl_val);
}
address = adev->nbio.funcs->get_pcie_index_offset(adev);
data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(address, smnDF_PIE_AON_FabricIndirectConfigAccessAddress3);
WREG32(data, ficaa_val);
WREG32(address, smnDF_PIE_AON_FabricIndirectConfigAccessDataHi3);
WREG32(data, ficadh_val);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
/*
address = adev->nbio.funcs->get_pcie_index_offset(adev);
data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(address, lo_addr);
*lo_val = RREG32(data);
WREG32(address, hi_addr);
*hi_val = RREG32(data);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
/*
address = adev->nbio.funcs->get_pcie_index_offset(adev);
data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(address, lo_addr);
WREG32(data, lo_val);
WREG32(address, hi_addr);
WREG32(data, hi_val);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
/* same as perfmon_wreg but return status on write value check */
address = adev->nbio.funcs->get_pcie_index_offset(adev);
data = adev->nbio.funcs->get_pcie_data_offset(adev);
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(address, lo_addr);
WREG32(data, lo_val);
WREG32(address, hi_addr);
lo_val_rb = RREG32(data);
WREG32(address, hi_addr);
hi_val_rb = RREG32(data);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
if (!(lo_val == lo_val_rb && hi_val == hi_val_rb))
return -EBUSY;
unsigned long flags;
u32 r;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(AMDGPU_PCIE_INDEX, reg);
(void)RREG32(AMDGPU_PCIE_INDEX);
r = RREG32(AMDGPU_PCIE_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
{
unsigned long flags;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(AMDGPU_PCIE_INDEX, reg);
(void)RREG32(AMDGPU_PCIE_INDEX);
WREG32(AMDGPU_PCIE_DATA, v);
(void)RREG32(AMDGPU_PCIE_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
unsigned long flags;
u32 r;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
(void)RREG32(PCIE_PORT_INDEX);
r = RREG32(PCIE_PORT_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
{
unsigned long flags;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
(void)RREG32(PCIE_PORT_INDEX);
WREG32(PCIE_PORT_DATA, (v));
(void)RREG32(PCIE_PORT_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
unsigned long flags;
u32 r;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
r = RREG32(EVERGREEN_PIF_PHY0_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
{
unsigned long flags;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
unsigned long flags;
u32 r;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
r = RREG32(EVERGREEN_PIF_PHY1_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
{
unsigned long flags;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
static void si_program_aspm(struct amdgpu_device *adev)
{
unsigned long flags;
u32 r;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32_NO_KIQ(mmPCIE_INDEX, reg);
(void)RREG32_NO_KIQ(mmPCIE_INDEX);
r = RREG32_NO_KIQ(mmPCIE_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
return r;
}
{
unsigned long flags;
- spin_lock_irqsave(&adev->pcie_idx_lock, flags);
+ spin_lock_irqsave(&adev->reg.pcie.lock, flags);
WREG32_NO_KIQ(mmPCIE_INDEX, reg);
(void)RREG32_NO_KIQ(mmPCIE_INDEX);
WREG32_NO_KIQ(mmPCIE_DATA, v);
(void)RREG32_NO_KIQ(mmPCIE_DATA);
- spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
+ spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
}
static u32 vi_smc_rreg(struct amdgpu_device *adev, u32 reg)