-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
drm/komeda: komeda_dev/pipeline/component definition and initialzation
1. Added a brief definition of komeda_dev/pipeline/component, this change didn't add the detailed component features and capabilities, which will be added in the following changes. 2. Corresponding resources discovery and initialzation functions. Changes in v4: - Deleted unnecessary headers Changes in v3: - Fixed style problem found by checkpatch.pl --strict. Changes in v2: - Unified abbreviation of "pipeline" to "pipe". Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com> Reviewed-by: Liviu Dudau <liviu.dudau@arm.com> Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
- Loading branch information
james qian wang (Arm Technology China)
authored and
Liviu Dudau
committed
Jan 14, 2019
1 parent
37fc9bb
commit bd628c1
Showing
11 changed files
with
826 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
obj-$(CONFIG_DRM_KOMEDA) += komeda/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
config DRM_KOMEDA | ||
tristate "ARM Komeda display driver" | ||
depends on DRM && OF | ||
depends on COMMON_CLK | ||
select DRM_KMS_HELPER | ||
select DRM_KMS_CMA_HELPER | ||
select DRM_GEM_CMA_HELPER | ||
select VIDEOMODE_HELPERS | ||
help | ||
Choose this option if you want to compile the ARM Komeda display | ||
Processor driver. It supports the D71 variants of the hardware. | ||
|
||
If compiled as a module it will be called komeda. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* (C) COPYRIGHT 2018 ARM Limited. All rights reserved. | ||
* Author: James.Qian.Wang <james.qian.wang@arm.com> | ||
* | ||
*/ | ||
#ifndef _MALIDP_PRODUCT_H_ | ||
#define _MALIDP_PRODUCT_H_ | ||
|
||
/* Product identification */ | ||
#define MALIDP_CORE_ID(__product, __major, __minor, __status) \ | ||
((((__product) & 0xFFFF) << 16) | (((__major) & 0xF) << 12) | \ | ||
(((__minor) & 0xF) << 8) | ((__status) & 0xFF)) | ||
|
||
#define MALIDP_CORE_ID_PRODUCT_ID(__core_id) ((__u32)(__core_id) >> 16) | ||
#define MALIDP_CORE_ID_MAJOR(__core_id) (((__u32)(__core_id) >> 12) & 0xF) | ||
#define MALIDP_CORE_ID_MINOR(__core_id) (((__u32)(__core_id) >> 8) & 0xF) | ||
#define MALIDP_CORE_ID_STATUS(__core_id) (((__u32)(__core_id)) & 0xFF) | ||
|
||
/* Mali-display product IDs */ | ||
#define MALIDP_D71_PRODUCT_ID 0x0071 | ||
|
||
#endif /* _MALIDP_PRODUCT_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* (C) COPYRIGHT 2018 ARM Limited. All rights reserved. | ||
* Author: James.Qian.Wang <james.qian.wang@arm.com> | ||
* | ||
*/ | ||
#ifndef _MALIDP_UTILS_ | ||
#define _MALIDP_UTILS_ | ||
|
||
#define has_bit(nr, mask) (BIT(nr) & (mask)) | ||
#define has_bits(bits, mask) (((bits) & (mask)) == (bits)) | ||
|
||
#define dp_for_each_set_bit(bit, mask) \ | ||
for_each_set_bit((bit), ((unsigned long *)&(mask)), sizeof(mask) * 8) | ||
|
||
#endif /* _MALIDP_UTILS_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
ccflags-y := \ | ||
-I$(src)/../include \ | ||
-I$(src) | ||
|
||
komeda-y := \ | ||
komeda_dev.o \ | ||
komeda_pipeline.o \ | ||
|
||
obj-$(CONFIG_DRM_KOMEDA) += komeda.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* (C) COPYRIGHT 2018 ARM Limited. All rights reserved. | ||
* Author: James.Qian.Wang <james.qian.wang@arm.com> | ||
* | ||
*/ | ||
#include <linux/platform_device.h> | ||
#include <linux/of_device.h> | ||
#include <linux/of_graph.h> | ||
#include "komeda_dev.h" | ||
|
||
struct komeda_dev *komeda_dev_create(struct device *dev) | ||
{ | ||
struct platform_device *pdev = to_platform_device(dev); | ||
const struct komeda_product_data *product; | ||
struct komeda_dev *mdev; | ||
struct resource *io_res; | ||
int err = 0; | ||
|
||
product = of_device_get_match_data(dev); | ||
if (!product) | ||
return ERR_PTR(-ENODEV); | ||
|
||
io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
if (!io_res) { | ||
DRM_ERROR("No registers defined.\n"); | ||
return ERR_PTR(-ENODEV); | ||
} | ||
|
||
mdev = devm_kzalloc(dev, sizeof(*mdev), GFP_KERNEL); | ||
if (!mdev) | ||
return ERR_PTR(-ENOMEM); | ||
|
||
mdev->dev = dev; | ||
mdev->reg_base = devm_ioremap_resource(dev, io_res); | ||
if (IS_ERR(mdev->reg_base)) { | ||
DRM_ERROR("Map register space failed.\n"); | ||
err = PTR_ERR(mdev->reg_base); | ||
mdev->reg_base = NULL; | ||
goto err_cleanup; | ||
} | ||
|
||
mdev->pclk = devm_clk_get(dev, "pclk"); | ||
if (IS_ERR(mdev->pclk)) { | ||
DRM_ERROR("Get APB clk failed.\n"); | ||
err = PTR_ERR(mdev->pclk); | ||
mdev->pclk = NULL; | ||
goto err_cleanup; | ||
} | ||
|
||
/* Enable APB clock to access the registers */ | ||
clk_prepare_enable(mdev->pclk); | ||
|
||
mdev->funcs = product->identify(mdev->reg_base, &mdev->chip); | ||
if (!komeda_product_match(mdev, product->product_id)) { | ||
DRM_ERROR("DT configured %x mismatch with real HW %x.\n", | ||
product->product_id, | ||
MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id)); | ||
err = -ENODEV; | ||
goto err_cleanup; | ||
} | ||
|
||
DRM_INFO("Found ARM Mali-D%x version r%dp%d\n", | ||
MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id), | ||
MALIDP_CORE_ID_MAJOR(mdev->chip.core_id), | ||
MALIDP_CORE_ID_MINOR(mdev->chip.core_id)); | ||
|
||
err = mdev->funcs->enum_resources(mdev); | ||
if (err) { | ||
DRM_ERROR("enumerate display resource failed.\n"); | ||
goto err_cleanup; | ||
} | ||
|
||
return mdev; | ||
|
||
err_cleanup: | ||
komeda_dev_destroy(mdev); | ||
return ERR_PTR(err); | ||
} | ||
|
||
void komeda_dev_destroy(struct komeda_dev *mdev) | ||
{ | ||
struct device *dev = mdev->dev; | ||
struct komeda_dev_funcs *funcs = mdev->funcs; | ||
int i; | ||
|
||
for (i = 0; i < mdev->n_pipelines; i++) { | ||
komeda_pipeline_destroy(mdev, mdev->pipelines[i]); | ||
mdev->pipelines[i] = NULL; | ||
} | ||
|
||
mdev->n_pipelines = 0; | ||
|
||
if (funcs && funcs->cleanup) | ||
funcs->cleanup(mdev); | ||
|
||
if (mdev->reg_base) { | ||
devm_iounmap(dev, mdev->reg_base); | ||
mdev->reg_base = NULL; | ||
} | ||
|
||
if (mdev->mclk) { | ||
devm_clk_put(dev, mdev->mclk); | ||
mdev->mclk = NULL; | ||
} | ||
|
||
if (mdev->pclk) { | ||
clk_disable_unprepare(mdev->pclk); | ||
devm_clk_put(dev, mdev->pclk); | ||
mdev->pclk = NULL; | ||
} | ||
|
||
devm_kfree(dev, mdev); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* (C) COPYRIGHT 2018 ARM Limited. All rights reserved. | ||
* Author: James.Qian.Wang <james.qian.wang@arm.com> | ||
* | ||
*/ | ||
#ifndef _KOMEDA_DEV_H_ | ||
#define _KOMEDA_DEV_H_ | ||
|
||
#include <linux/device.h> | ||
#include <linux/clk.h> | ||
#include "komeda_pipeline.h" | ||
#include "malidp_product.h" | ||
|
||
/* malidp device id */ | ||
enum { | ||
MALI_D71 = 0, | ||
}; | ||
|
||
/* pipeline DT ports */ | ||
enum { | ||
KOMEDA_OF_PORT_OUTPUT = 0, | ||
KOMEDA_OF_PORT_COPROC = 1, | ||
}; | ||
|
||
struct komeda_chip_info { | ||
u32 arch_id; | ||
u32 core_id; | ||
u32 core_info; | ||
u32 bus_width; | ||
}; | ||
|
||
struct komeda_product_data { | ||
u32 product_id; | ||
struct komeda_dev_funcs *(*identify)(u32 __iomem *reg, | ||
struct komeda_chip_info *info); | ||
}; | ||
|
||
struct komeda_dev; | ||
|
||
/** | ||
* struct komeda_dev_funcs | ||
* | ||
* Supplied by chip level and returned by the chip entry function xxx_identify, | ||
*/ | ||
struct komeda_dev_funcs { | ||
/** | ||
* @enum_resources: | ||
* | ||
* for CHIP to report or add pipeline and component resources to CORE | ||
*/ | ||
int (*enum_resources)(struct komeda_dev *mdev); | ||
/** @cleanup: call to chip to cleanup komeda_dev->chip data */ | ||
void (*cleanup)(struct komeda_dev *mdev); | ||
}; | ||
|
||
/** | ||
* struct komeda_dev | ||
* | ||
* Pipeline and component are used to describe how to handle the pixel data. | ||
* komeda_device is for describing the whole view of the device, and the | ||
* control-abilites of device. | ||
*/ | ||
struct komeda_dev { | ||
struct device *dev; | ||
u32 __iomem *reg_base; | ||
|
||
struct komeda_chip_info chip; | ||
|
||
/** @pclk: APB clock for register access */ | ||
struct clk *pclk; | ||
/** @mck: HW main engine clk */ | ||
struct clk *mclk; | ||
|
||
int n_pipelines; | ||
struct komeda_pipeline *pipelines[KOMEDA_MAX_PIPELINES]; | ||
|
||
/** @funcs: chip funcs to access to HW */ | ||
struct komeda_dev_funcs *funcs; | ||
/** | ||
* @chip_data: | ||
* | ||
* chip data will be added by &komeda_dev_funcs.enum_resources() and | ||
* destroyed by &komeda_dev_funcs.cleanup() | ||
*/ | ||
void *chip_data; | ||
}; | ||
|
||
static inline bool | ||
komeda_product_match(struct komeda_dev *mdev, u32 target) | ||
{ | ||
return MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id) == target; | ||
} | ||
|
||
struct komeda_dev *komeda_dev_create(struct device *dev); | ||
void komeda_dev_destroy(struct komeda_dev *mdev); | ||
|
||
#endif /*_KOMEDA_DEV_H_*/ |
Oops, something went wrong.