Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion drivers/gpu/drm/apple/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ appledrm-$(CONFIG_DRM_APPLE_AUDIO) += audio.o
appledrm-$(CONFIG_DRM_APPLE_AUDIO) += av.o
appledrm-y += connector.o
appledrm-y += ibootep.o
appledrm-y += iomfb_v12_3.o
appledrm-y += iomfb_v13_3.o
appledrm-y += iomfb_v14_7.o
appledrm-y += epic/dpavservep.o
appledrm-y += plane.o

Expand Down
4 changes: 1 addition & 3 deletions drivers/gpu/drm/apple/apple_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -277,13 +277,11 @@ static int apple_probe_per_dcp(struct device *dev,
int ret;
u32 surf;
int zpos = 0;
bool supports_l10r = !dcp_fw_compat_is_12_x(dcp);
enum drm_plane_type plane_type;

for_each_set_bit(surf, iomfb_surfaces, DCP_MAX_PLANES) {
plane_type = (zpos == 0) ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY;
planes[zpos] = apple_plane_init(drm, 1U << num, surf,
supports_l10r, plane_type);
planes[zpos] = apple_plane_init(drm, 1U << num, surf, plane_type);
if (IS_ERR(planes[zpos]))
return PTR_ERR(planes[zpos]);

Expand Down
15 changes: 1 addition & 14 deletions drivers/gpu/drm/apple/av.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,6 @@ struct dcp_av_audio_cmds {
u32 get_product_attrs;
};

static const struct dcp_av_audio_cmds dcp_av_audio_cmds_v12_3 = {
.open = 6,
.close = 7,
.prepare = 8,
.start_link = 9,
.stop_link = 12,
.unprepare = 13,
.get_elements = 18,
.get_product_attrs = 20,
};

static const struct dcp_av_audio_cmds dcp_av_audio_cmds_v13_5 = {
.open = 4,
.close = 5,
Expand Down Expand Up @@ -389,10 +378,8 @@ int avep_init(struct apple_dcp *dcp)
mutex_init(&audiosrv_data->plug_lock);

switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
audiosrv_data->cmds = dcp_av_audio_cmds_v12_3;
break;
case DCP_FIRMWARE_V_13_5:
case DCP_FIRMWARE_V_14_7:
audiosrv_data->cmds = dcp_av_audio_cmds_v13_5;
break;
default:
Expand Down
11 changes: 3 additions & 8 deletions drivers/gpu/drm/apple/dcp-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@

#include "dptxep.h"
#include "iomfb.h"
#include "iomfb_v12_3.h"
#include "iomfb_v13_3.h"
#include "iomfb_v14_7.h"
#include "epic/dpavservep.h"
#include "version_utils.h"

#define DCP_MAX_PLANES 4

Expand All @@ -27,12 +28,6 @@ struct apple_dcp_afkep;

struct dcpav_service_epic;

enum dcp_firmware_version {
DCP_FIRMWARE_UNKNOWN,
DCP_FIRMWARE_V_12_3,
DCP_FIRMWARE_V_13_5,
};

enum {
SYSTEM_ENDPOINT = 0x20,
TEST_ENDPOINT = 0x21,
Expand Down Expand Up @@ -176,8 +171,8 @@ struct apple_dcp {

/* Queued swap. Owned by the DCP to avoid per-swap memory allocation */
union {
struct dcp_swap_submit_req_v12_3 v12_3;
struct dcp_swap_submit_req_v13_3 v13_3;
struct dcp_swap_submit_req_v14_7_0 v14_7_0;
} swap;

/* swap id of the last completed swap */
Expand Down
31 changes: 12 additions & 19 deletions drivers/gpu/drm/apple/dcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -485,14 +485,6 @@ void dcp_link(struct platform_device *pdev, struct apple_crtc *crtc,
dcp->connector = connector;
}


bool dcp_fw_compat_is_12_x(struct platform_device *pdev)
{
struct apple_dcp *dcp = platform_get_drvdata(pdev);

return dcp->fw_compat == DCP_FIRMWARE_V_12_3;
}

unsigned long* dcp_get_iomfb_surfaces(struct platform_device *pdev)
{
struct apple_dcp *dcp = platform_get_drvdata(pdev);
Expand Down Expand Up @@ -575,12 +567,12 @@ int dcp_start(struct platform_device *pdev)
static void _dcp_poweroff(struct apple_dcp *dcp)
{
switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
iomfb_poweroff_v12_3(dcp);
break;
case DCP_FIRMWARE_V_13_5:
iomfb_poweroff_v13_3(dcp);
break;
case DCP_FIRMWARE_V_14_7:
iomfb_poweroff_v14_7_0(dcp);
break;
default:
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
break;
Expand Down Expand Up @@ -634,12 +626,12 @@ int dcp_wait_ready(struct platform_device *pdev, u64 timeout)
static void __maybe_unused dcp_sleep(struct apple_dcp *dcp)
{
switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
iomfb_sleep_v12_3(dcp);
break;
case DCP_FIRMWARE_V_13_5:
iomfb_sleep_v13_3(dcp);
break;
case DCP_FIRMWARE_V_14_7:
iomfb_sleep_v14_7_0(dcp);
break;
default:
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
break;
Expand All @@ -659,12 +651,12 @@ void dcp_poweron(struct platform_device *pdev)
}

switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
iomfb_poweron_v12_3(dcp);
break;
case DCP_FIRMWARE_V_13_5:
iomfb_poweron_v13_3(dcp);
break;
case DCP_FIRMWARE_V_14_7:
iomfb_poweron_v14_7_0(dcp);
break;
default:
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
break;
Expand Down Expand Up @@ -950,8 +942,6 @@ static enum dcp_firmware_version dcp_check_firmware_version(struct device *dev)
return DCP_FIRMWARE_UNKNOWN;
}

if (strncmp(compat_str, "12.3.0", sizeof(compat_str)) == 0)
return DCP_FIRMWARE_V_12_3;
/*
* m1n1 reports firmware version 13.5 as compatible with 13.3. This is
* only true for the iomfb endpoint. The interface for the dptx-port
Expand All @@ -964,6 +954,9 @@ static enum dcp_firmware_version dcp_check_firmware_version(struct device *dev)
return DCP_FIRMWARE_V_13_5;
else if (strncmp(compat_str, "13.5.0", sizeof(compat_str)) == 0)
return DCP_FIRMWARE_V_13_5;
else if (strncmp(compat_str, "14.7.0", sizeof(compat_str)) == 0 &&
(strncmp(fw_str, "14.7.0", sizeof(compat_str)) == 0))
return DCP_FIRMWARE_V_14_7;

dev_err(dev, "DCP firmware-compat %s (FW: %s) is not supported\n",
compat_str, fw_str);
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/apple/dcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ void dcp_poweron(struct platform_device *pdev);
int dcp_set_crc(struct drm_crtc *crtc, bool enabled);
int dcp_crtc_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *state);
int dcp_get_connector_type(struct platform_device *pdev);
bool dcp_fw_compat_is_12_x(struct platform_device *pdev);
unsigned long* dcp_get_iomfb_surfaces(struct platform_device *pdev);
void dcp_link(struct platform_device *pdev, struct apple_crtc *apple,
struct apple_connector *connector);
Expand Down
24 changes: 12 additions & 12 deletions drivers/gpu/drm/apple/iomfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -430,12 +430,12 @@ int dcp_crtc_atomic_modeset(struct drm_crtc *crtc,
return 0;

switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
ret = iomfb_modeset_v12_3(dcp, crtc_state);
break;
case DCP_FIRMWARE_V_13_5:
ret = iomfb_modeset_v13_3(dcp, crtc_state);
break;
case DCP_FIRMWARE_V_14_7:
ret = iomfb_modeset_v14_7_0(dcp, crtc_state);
break;
default:
WARN_ONCE(true, "Unexpected firmware version: %u\n",
dcp->fw_compat);
Expand Down Expand Up @@ -479,12 +479,12 @@ void dcp_flush(struct drm_crtc *crtc, struct drm_atomic_state *state)
}

switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
iomfb_flush_v12_3(dcp, crtc, state);
break;
case DCP_FIRMWARE_V_13_5:
iomfb_flush_v13_3(dcp, crtc, state);
break;
case DCP_FIRMWARE_V_14_7:
iomfb_flush_v14_7_0(dcp, crtc, state);
break;
default:
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
break;
Expand All @@ -494,12 +494,12 @@ void dcp_flush(struct drm_crtc *crtc, struct drm_atomic_state *state)
static void iomfb_start(struct apple_dcp *dcp)
{
switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
iomfb_start_v12_3(dcp);
break;
case DCP_FIRMWARE_V_13_5:
iomfb_start_v13_3(dcp);
break;
case DCP_FIRMWARE_V_14_7:
iomfb_start_v14_7_0(dcp);
break;
default:
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
break;
Expand Down Expand Up @@ -545,12 +545,12 @@ void iomfb_shutdown(struct apple_dcp *dcp)
dcp->valid_mode = false;

switch (dcp->fw_compat) {
case DCP_FIRMWARE_V_12_3:
iomfb_shutdown_v12_3(dcp);
break;
case DCP_FIRMWARE_V_13_5:
iomfb_shutdown_v13_3(dcp);
break;
case DCP_FIRMWARE_V_14_7:
iomfb_shutdown_v14_7_0(dcp);
break;
default:
WARN_ONCE(true, "Unexpected firmware version: %u\n", dcp->fw_compat);
break;
Expand Down
3 changes: 2 additions & 1 deletion drivers/gpu/drm/apple/iomfb.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ struct dcp_packet_header {
#define DCP_PACKET_ALIGNMENT (0x40)

enum iomfb_property_id {
IOMFB_PROPERTY_NITS = 15, // divide by Brightness_Scale
IOMFB_PROPERTY_NITS_V13_3 = 15, // divide by Brightness_Scale
IOMFB_PROPERTY_NITS_V14_7 = 19,
};

#define IOMFB_BRIGHTNESS_MIN 0x10000000
Expand Down
23 changes: 21 additions & 2 deletions drivers/gpu/drm/apple/iomfb_plane.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,33 @@ struct dcp_plane_info {
u16 tile_size;
u8 tile_w;
u8 tile_h;
u32 unk[13];
u8 unk[0xd];
u8 unk2;
u8 unk3[0x26];
} __packed;

struct dcp_component_types {
u8 count;
u8 types[7];
} __packed;

struct dcp_compression_info {
u32 tile_w;
u32 tile_h;
u32 metadata_offset;
u32 data_offset;
u32 meta_bytes;
u32 tiles_w;
u32 tiles_h;
u32 unk_1;
u32 compression_type;
u32 unk3;
u8 padding[3];
u32 tile_bytes;
u32 row_stride;
u8 pad2;
} __packed;

/* Information describing a surface */
struct dcp_surface {
u8 is_tiled;
Expand All @@ -100,7 +119,7 @@ struct dcp_surface {
u64 has_comp;
struct dcp_plane_info planes[DCP_SURF_MAX_PLANES];
u64 has_planes;
u32 compression_info[DCP_SURF_MAX_PLANES][13];
struct dcp_compression_info compression_info[DCP_SURF_MAX_PLANES];
u64 has_compr_info;
u32 unk_num;
u32 unk_denom;
Expand Down
19 changes: 18 additions & 1 deletion drivers/gpu/drm/apple/iomfb_template.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,8 @@ static bool iomfbep_cb_match_backlight_service(struct apple_dcp *dcp, int tag, v
static void iomfb_cb_pr_publish(struct apple_dcp *dcp, struct iomfb_property *prop)
{
switch (prop->id) {
case IOMFB_PROPERTY_NITS:
case IOMFB_PROPERTY_NITS_V13_3:
case IOMFB_PROPERTY_NITS_V14_7:
{
if (dcp_has_panel(dcp)) {
dcp->brightness.nits = prop->value / dcp->brightness.scale;
Expand Down Expand Up @@ -738,6 +739,8 @@ static void dcp_swap_cleared(struct apple_dcp *dcp, void *data, void *cookie)
return;
}

/* TODO: Figure out how to clear surfaces for 14.x */
#if DCP_FW_VER < DCP_FW_VERSION(14, 7, 0)
while (!list_empty(&dcp->swapped_out_fbs)) {
struct dcp_fb_reference *entry;
entry = list_first_entry(&dcp->swapped_out_fbs,
Expand All @@ -749,6 +752,7 @@ static void dcp_swap_cleared(struct apple_dcp *dcp, void *data, void *cookie)
list_del(&entry->head);
kfree(entry);
}
#endif
}

static void dcp_swap_clear_started(struct apple_dcp *dcp, void *data,
Expand Down Expand Up @@ -909,7 +913,11 @@ void DCP_FW_NAME(iomfb_poweroff)(struct apple_dcp *dcp)
* brightness.
*/
if (dcp_has_panel(dcp)) {
#if DCP_FW_VER < DCP_FW_VERSION(14, 7, 0)
swap->swap.bl_unk = 1;
#else
swap->swap.bl_update = 1;
#endif
swap->swap.bl_value = 0;
swap->swap.bl_power = 0;
}
Expand Down Expand Up @@ -1145,6 +1153,8 @@ static void dcp_swapped(struct apple_dcp *dcp, void *data, void *cookie)
}
dcp->swap_start = ktime_get();

/* TODO: Figure out how to clear surfaces on 14.x */
#if DCP_FW_VER < DCP_FW_VERSION(14, 7, 0)
while (!list_empty(&dcp->swapped_out_fbs)) {
struct dcp_fb_reference *entry;
entry = list_first_entry(&dcp->swapped_out_fbs,
Expand All @@ -1156,6 +1166,7 @@ static void dcp_swapped(struct apple_dcp *dcp, void *data, void *cookie)
list_del(&entry->head);
kfree(entry);
}
#endif
}

static void dcp_swap_started(struct apple_dcp *dcp, void *data, void *cookie)
Expand Down Expand Up @@ -1350,6 +1361,8 @@ void DCP_FW_NAME(iomfb_flush)(struct apple_dcp *dcp, struct drm_crtc *crtc, stru
req->swap.src_rect[l] = apple_state->src_rect;
req->swap.dst_rect[l] = apple_state->dst_rect;

req->swap.surf_ids[apl_plane->iomfb_surf] = plane->base.id;

if (dcp->notch_height > 0)
req->swap.dst_rect[l].y += dcp->notch_height;

Expand Down Expand Up @@ -1394,7 +1407,11 @@ void DCP_FW_NAME(iomfb_flush)(struct apple_dcp *dcp, struct drm_crtc *crtc, stru

/* update brightness if changed */
if (dcp_has_panel(dcp) && dcp->brightness.update) {
#if DCP_FW_VER >= DCP_FW_VERSION(14, 7, 0)
req->swap.bl_update = 1;
#else
req->swap.bl_unk = 1;
#endif
req->swap.bl_value = dcp->brightness.dac;
req->swap.bl_power = 0x40;
dcp->brightness.update = false;
Expand Down
Loading