Skip to content

Commit 25286aa

Browse files
dceraoloickle
authored andcommitted
drm/i915: move regs pointer inside the uncore structure
This will allow futher simplifications in the uncore handling. v2: move register access setup under uncore (Chris) Signed-off-by: Daniele Ceraolo Spurio <[email protected]> Cc: Paulo Zanoni <[email protected]> Cc: Chris Wilson <[email protected]> Reviewed-by: Paulo Zanoni <[email protected]> Signed-off-by: Chris Wilson <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 272c7e5 commit 25286aa

File tree

7 files changed

+75
-68
lines changed

7 files changed

+75
-68
lines changed

drivers/gpu/drm/i915/i915_drv.c

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -968,46 +968,6 @@ static void i915_driver_cleanup_early(struct drm_i915_private *dev_priv)
968968
i915_engines_cleanup(dev_priv);
969969
}
970970

971-
static int i915_mmio_setup(struct drm_i915_private *dev_priv)
972-
{
973-
struct pci_dev *pdev = dev_priv->drm.pdev;
974-
int mmio_bar;
975-
int mmio_size;
976-
977-
mmio_bar = IS_GEN(dev_priv, 2) ? 1 : 0;
978-
/*
979-
* Before gen4, the registers and the GTT are behind different BARs.
980-
* However, from gen4 onwards, the registers and the GTT are shared
981-
* in the same BAR, so we want to restrict this ioremap from
982-
* clobbering the GTT which we want ioremap_wc instead. Fortunately,
983-
* the register BAR remains the same size for all the earlier
984-
* generations up to Ironlake.
985-
*/
986-
if (INTEL_GEN(dev_priv) < 5)
987-
mmio_size = 512 * 1024;
988-
else
989-
mmio_size = 2 * 1024 * 1024;
990-
dev_priv->regs = pci_iomap(pdev, mmio_bar, mmio_size);
991-
if (dev_priv->regs == NULL) {
992-
DRM_ERROR("failed to map registers\n");
993-
994-
return -EIO;
995-
}
996-
997-
/* Try to make sure MCHBAR is enabled before poking at it */
998-
intel_setup_mchbar(dev_priv);
999-
1000-
return 0;
1001-
}
1002-
1003-
static void i915_mmio_cleanup(struct drm_i915_private *dev_priv)
1004-
{
1005-
struct pci_dev *pdev = dev_priv->drm.pdev;
1006-
1007-
intel_teardown_mchbar(dev_priv);
1008-
pci_iounmap(pdev, dev_priv->regs);
1009-
}
1010-
1011971
/**
1012972
* i915_driver_init_mmio - setup device MMIO
1013973
* @dev_priv: device private
@@ -1027,11 +987,12 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
1027987
if (i915_get_bridge_dev(dev_priv))
1028988
return -EIO;
1029989

1030-
ret = i915_mmio_setup(dev_priv);
990+
ret = intel_uncore_init(&dev_priv->uncore);
1031991
if (ret < 0)
1032992
goto err_bridge;
1033993

1034-
intel_uncore_init(&dev_priv->uncore);
994+
/* Try to make sure MCHBAR is enabled before poking at it */
995+
intel_setup_mchbar(dev_priv);
1035996

1036997
intel_device_info_init_mmio(dev_priv);
1037998

@@ -1048,8 +1009,8 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
10481009
return 0;
10491010

10501011
err_uncore:
1012+
intel_teardown_mchbar(dev_priv);
10511013
intel_uncore_fini(&dev_priv->uncore);
1052-
i915_mmio_cleanup(dev_priv);
10531014
err_bridge:
10541015
pci_dev_put(dev_priv->bridge_dev);
10551016

@@ -1062,8 +1023,8 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
10621023
*/
10631024
static void i915_driver_cleanup_mmio(struct drm_i915_private *dev_priv)
10641025
{
1026+
intel_teardown_mchbar(dev_priv);
10651027
intel_uncore_fini(&dev_priv->uncore);
1066-
i915_mmio_cleanup(dev_priv);
10671028
pci_dev_put(dev_priv->bridge_dev);
10681029
}
10691030

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,8 +1505,6 @@ struct drm_i915_private {
15051505
*/
15061506
resource_size_t stolen_usable_size; /* Total size minus reserved ranges */
15071507

1508-
void __iomem *regs;
1509-
15101508
struct intel_uncore uncore;
15111509

15121510
struct i915_virtual_gpu vgpu;
@@ -3489,14 +3487,14 @@ static inline u64 intel_rc6_residency_us(struct drm_i915_private *dev_priv,
34893487
static inline uint##x##_t __raw_i915_read##x(const struct drm_i915_private *dev_priv, \
34903488
i915_reg_t reg) \
34913489
{ \
3492-
return read##s(dev_priv->regs + i915_mmio_reg_offset(reg)); \
3490+
return read##s(dev_priv->uncore.regs + i915_mmio_reg_offset(reg)); \
34933491
}
34943492

34953493
#define __raw_write(x, s) \
34963494
static inline void __raw_i915_write##x(const struct drm_i915_private *dev_priv, \
34973495
i915_reg_t reg, uint##x##_t val) \
34983496
{ \
3499-
write##s(val, dev_priv->regs + i915_mmio_reg_offset(reg)); \
3497+
write##s(val, dev_priv->uncore.regs + i915_mmio_reg_offset(reg)); \
35003498
}
35013499
__raw_read(8, b)
35023500
__raw_read(16, w)

drivers/gpu/drm/i915/i915_irq.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ static bool gen11_reset_one_iir(struct drm_i915_private * const i915,
268268
const unsigned int bank,
269269
const unsigned int bit)
270270
{
271-
void __iomem * const regs = i915->regs;
271+
void __iomem * const regs = i915->uncore.regs;
272272
u32 dw;
273273

274274
lockdep_assert_held(&i915->irq_lock);
@@ -1479,7 +1479,7 @@ gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir)
14791479
static void gen8_gt_irq_ack(struct drm_i915_private *i915,
14801480
u32 master_ctl, u32 gt_iir[4])
14811481
{
1482-
void __iomem * const regs = i915->regs;
1482+
void __iomem * const regs = i915->uncore.regs;
14831483

14841484
#define GEN8_GT_IRQS (GEN8_GT_RCS_IRQ | \
14851485
GEN8_GT_BCS_IRQ | \
@@ -2876,7 +2876,7 @@ static inline void gen8_master_intr_enable(void __iomem * const regs)
28762876
static irqreturn_t gen8_irq_handler(int irq, void *arg)
28772877
{
28782878
struct drm_i915_private *dev_priv = to_i915(arg);
2879-
void __iomem * const regs = dev_priv->regs;
2879+
void __iomem * const regs = dev_priv->uncore.regs;
28802880
u32 master_ctl;
28812881
u32 gt_iir[4];
28822882

@@ -2910,7 +2910,7 @@ static u32
29102910
gen11_gt_engine_identity(struct drm_i915_private * const i915,
29112911
const unsigned int bank, const unsigned int bit)
29122912
{
2913-
void __iomem * const regs = i915->regs;
2913+
void __iomem * const regs = i915->uncore.regs;
29142914
u32 timeout_ts;
29152915
u32 ident;
29162916

@@ -2994,7 +2994,7 @@ static void
29942994
gen11_gt_bank_handler(struct drm_i915_private * const i915,
29952995
const unsigned int bank)
29962996
{
2997-
void __iomem * const regs = i915->regs;
2997+
void __iomem * const regs = i915->uncore.regs;
29982998
unsigned long intr_dw;
29992999
unsigned int bit;
30003000

@@ -3037,7 +3037,7 @@ gen11_gt_irq_handler(struct drm_i915_private * const i915,
30373037
static u32
30383038
gen11_gu_misc_irq_ack(struct drm_i915_private *dev_priv, const u32 master_ctl)
30393039
{
3040-
void __iomem * const regs = dev_priv->regs;
3040+
void __iomem * const regs = dev_priv->uncore.regs;
30413041
u32 iir;
30423042

30433043
if (!(master_ctl & GEN11_GU_MISC_IRQ))
@@ -3078,7 +3078,7 @@ static inline void gen11_master_intr_enable(void __iomem * const regs)
30783078
static irqreturn_t gen11_irq_handler(int irq, void *arg)
30793079
{
30803080
struct drm_i915_private * const i915 = to_i915(arg);
3081-
void __iomem * const regs = i915->regs;
3081+
void __iomem * const regs = i915->uncore.regs;
30823082
u32 master_ctl;
30833083
u32 gu_misc_iir;
30843084

@@ -3359,7 +3359,7 @@ static void gen8_irq_reset(struct drm_device *dev)
33593359
struct drm_i915_private *dev_priv = to_i915(dev);
33603360
int pipe;
33613361

3362-
gen8_master_intr_disable(dev_priv->regs);
3362+
gen8_master_intr_disable(dev_priv->uncore.regs);
33633363

33643364
gen8_gt_irq_reset(dev_priv);
33653365

@@ -3401,7 +3401,7 @@ static void gen11_irq_reset(struct drm_device *dev)
34013401
struct drm_i915_private *dev_priv = dev->dev_private;
34023402
int pipe;
34033403

3404-
gen11_master_intr_disable(dev_priv->regs);
3404+
gen11_master_intr_disable(dev_priv->uncore.regs);
34053405

34063406
gen11_gt_irq_reset(dev_priv);
34073407

@@ -4006,7 +4006,7 @@ static int gen8_irq_postinstall(struct drm_device *dev)
40064006
if (HAS_PCH_SPLIT(dev_priv))
40074007
ibx_irq_postinstall(dev);
40084008

4009-
gen8_master_intr_enable(dev_priv->regs);
4009+
gen8_master_intr_enable(dev_priv->uncore.regs);
40104010

40114011
return 0;
40124012
}
@@ -4068,7 +4068,7 @@ static int gen11_irq_postinstall(struct drm_device *dev)
40684068

40694069
I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
40704070

4071-
gen11_master_intr_enable(dev_priv->regs);
4071+
gen11_master_intr_enable(dev_priv->uncore.regs);
40724072
POSTING_READ(GEN11_GFX_MSTR_IRQ);
40734073

40744074
return 0;

drivers/gpu/drm/i915/intel_lrc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,12 +2409,12 @@ static int logical_ring_init(struct intel_engine_cs *engine)
24092409
intel_engine_init_workarounds(engine);
24102410

24112411
if (HAS_LOGICAL_RING_ELSQ(i915)) {
2412-
execlists->submit_reg = i915->regs +
2412+
execlists->submit_reg = i915->uncore.regs +
24132413
i915_mmio_reg_offset(RING_EXECLIST_SQ_CONTENTS(engine));
2414-
execlists->ctrl_reg = i915->regs +
2414+
execlists->ctrl_reg = i915->uncore.regs +
24152415
i915_mmio_reg_offset(RING_EXECLIST_CONTROL(engine));
24162416
} else {
2417-
execlists->submit_reg = i915->regs +
2417+
execlists->submit_reg = i915->uncore.regs +
24182418
i915_mmio_reg_offset(RING_ELSP(engine));
24192419
}
24202420

drivers/gpu/drm/i915/intel_uncore.c

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,7 +1330,6 @@ static void fw_domain_init(struct intel_uncore *uncore,
13301330
i915_reg_t reg_ack)
13311331
{
13321332
struct intel_uncore_forcewake_domain *d;
1333-
struct drm_i915_private *i915 = uncore_to_i915(uncore);
13341333

13351334
if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
13361335
return;
@@ -1343,8 +1342,8 @@ static void fw_domain_init(struct intel_uncore *uncore,
13431342
WARN_ON(!i915_mmio_reg_valid(reg_ack));
13441343

13451344
d->wake_count = 0;
1346-
d->reg_set = i915->regs + i915_mmio_reg_offset(reg_set);
1347-
d->reg_ack = i915->regs + i915_mmio_reg_offset(reg_ack);
1345+
d->reg_set = uncore->regs + i915_mmio_reg_offset(reg_set);
1346+
d->reg_ack = uncore->regs + i915_mmio_reg_offset(reg_ack);
13481347

13491348
d->id = domain_id;
13501349

@@ -1539,9 +1538,53 @@ static int i915_pmic_bus_access_notifier(struct notifier_block *nb,
15391538
return NOTIFY_OK;
15401539
}
15411540

1542-
void intel_uncore_init(struct intel_uncore *uncore)
1541+
static int uncore_mmio_setup(struct intel_uncore *uncore)
15431542
{
15441543
struct drm_i915_private *i915 = uncore_to_i915(uncore);
1544+
struct pci_dev *pdev = i915->drm.pdev;
1545+
int mmio_bar;
1546+
int mmio_size;
1547+
1548+
mmio_bar = IS_GEN(i915, 2) ? 1 : 0;
1549+
/*
1550+
* Before gen4, the registers and the GTT are behind different BARs.
1551+
* However, from gen4 onwards, the registers and the GTT are shared
1552+
* in the same BAR, so we want to restrict this ioremap from
1553+
* clobbering the GTT which we want ioremap_wc instead. Fortunately,
1554+
* the register BAR remains the same size for all the earlier
1555+
* generations up to Ironlake.
1556+
*/
1557+
if (INTEL_GEN(i915) < 5)
1558+
mmio_size = 512 * 1024;
1559+
else
1560+
mmio_size = 2 * 1024 * 1024;
1561+
uncore->regs = pci_iomap(pdev, mmio_bar, mmio_size);
1562+
if (uncore->regs == NULL) {
1563+
DRM_ERROR("failed to map registers\n");
1564+
1565+
return -EIO;
1566+
}
1567+
1568+
return 0;
1569+
}
1570+
1571+
static void uncore_mmio_cleanup(struct intel_uncore *uncore)
1572+
{
1573+
struct drm_i915_private *i915 = uncore_to_i915(uncore);
1574+
struct pci_dev *pdev = i915->drm.pdev;
1575+
1576+
pci_iounmap(pdev, uncore->regs);
1577+
}
1578+
1579+
1580+
int intel_uncore_init(struct intel_uncore *uncore)
1581+
{
1582+
struct drm_i915_private *i915 = uncore_to_i915(uncore);
1583+
int ret;
1584+
1585+
ret = uncore_mmio_setup(uncore);
1586+
if (ret)
1587+
return ret;
15451588

15461589
i915_check_vgpu(i915);
15471590

@@ -1589,6 +1632,8 @@ void intel_uncore_init(struct intel_uncore *uncore)
15891632
}
15901633

15911634
iosf_mbi_register_pmic_bus_access_notifier(&uncore->pmic_bus_access_nb);
1635+
1636+
return 0;
15921637
}
15931638

15941639
/*
@@ -1637,6 +1682,7 @@ void intel_uncore_fini(struct intel_uncore *uncore)
16371682
&uncore->pmic_bus_access_nb);
16381683
intel_uncore_forcewake_reset(uncore);
16391684
iosf_mbi_punit_release();
1685+
uncore_mmio_cleanup(uncore);
16401686
}
16411687

16421688
static const struct reg_whitelist {

drivers/gpu/drm/i915/intel_uncore.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ struct intel_forcewake_range {
9393
};
9494

9595
struct intel_uncore {
96+
void __iomem *regs;
97+
9698
spinlock_t lock; /** lock is also taken in irq contexts. */
9799

98100
const struct intel_forcewake_range *fw_domains_table;
@@ -142,7 +144,7 @@ forcewake_domain_to_uncore(const struct intel_uncore_forcewake_domain *d)
142144
}
143145

144146
void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
145-
void intel_uncore_init(struct intel_uncore *uncore);
147+
int intel_uncore_init(struct intel_uncore *uncore);
146148
void intel_uncore_prune(struct intel_uncore *uncore);
147149
bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
148150
bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv);

drivers/gpu/drm/i915/selftests/intel_uncore.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ static int live_forcewake_ops(void *arg)
177177

178178
for_each_engine(engine, i915, id) {
179179
i915_reg_t mmio = _MMIO(engine->mmio_base + r->offset);
180-
u32 __iomem *reg = i915->regs + engine->mmio_base + r->offset;
180+
u32 __iomem *reg = uncore->regs + engine->mmio_base + r->offset;
181181
enum forcewake_domains fw_domains;
182182
u32 val;
183183

0 commit comments

Comments
 (0)